package com.dtec.swing;

import javax.swing.JButton;

import java.awt.*;
import java.awt.geom.*;

public class RoundButton extends JButton {

	private static final long serialVersionUID = 1L;
	private int rc;
	private int gc;
	private int bc;

	public RoundButton(String label, int ri, int gi, int bi) {
		super(label);
		if (ri > 255 || gi > 255 || bi > 255) {
			ri = 255;
			gi = 255;
			bi = 255;
		}

		this.rc = ri;
		this.gc = gi;
		this.bc = bi;
		// 下面的语句讲述这个按钮变为一个圆形而不是椭圆形
		Dimension size = getPreferredSize();
		size.width = size.height = Math.max(size.width, size.height);
		setPreferredSize(size);
		// 不让JButton画背景而允许我们去画一个圆背景
		setContentAreaFilled(false);
	}

	public int artX(int r, int h, int y) {
		return ((int) Math.sqrt(r * r - (y - h / 2) * (y - h / 2)) + h / 2);
	}

	// 画出圆的背景和标签
	protected void paintComponent(Graphics g) {
		if (getModel().isArmed()) {
			g.setColor(new Color(rc, gc, bc));
			g.fillOval(0, 0, getSize().width - 1, getSize().height - 1);
		} else {
			int ri = rc, gi = gc, bi = bc;
			if ((getSize().height / 10 * 3) < 55) {
				if (ri < gi && ri < bi) {
					ri = 255 - getSize().height / 10 * 3;
					gi = 255;
					bi = 255;
				} else if (gi < ri && gi < bi) {
					gi = 255 - getSize().height / 10 * 3;
					ri = 255;
					bi = 255;
				} else if (bi < gi && bi < ri) {
					bi = 255 - getSize().height / 10 * 3;
					gi = 255;
					ri = 255;
				}
			}
			int sub1, sub2;
			int i, j;
			for (i = 0; i <= (getSize().height / 10 * 3); i++) {
				sub1 = artX(getSize().width / 2, getSize().height, i);
				g.setColor(new Color(ri, gi, bi));
				g.drawLine(sub1, i, getSize().width - sub1, i);
				ri++;
				gi++;
				bi++;
				if (bi > 255)
					bi = 255;
				if (gi > 255)
					gi = 255;
				if (ri > 255)
					ri = 255;
			}
			ri = rc;
			gi = gc;
			bi = bc;
			if ((getSize().height / 10 * 7) < 55) {
				if (ri < gi && ri < bi) {
					ri = 255 - getSize().height / 10 * 7;
					gi = 255;
					bi = 255;
				} else if (gi < ri && gi < bi) {
					gi = 255 - getSize().height / 10 * 7;
					ri = 255;
					bi = 255;
				} else if (bi < gi && bi < ri) {
					bi = 255 - getSize().height / 10 * 7;
					gi = 255;
					ri = 255;
				}
			}

			for (j = getSize().height; j > (getSize().height / 10 * 3); j--) {
				sub2 = artX(getSize().width / 2, getSize().height, j);
				g.setColor(new Color(ri, gi, bi));
				g.drawLine(sub2, j, getSize().width - sub2, j);
				ri++;
				gi++;
				bi++;
				if (bi > 255)
					bi = 255;
				if (gi > 255)
					gi = 255;
				if (ri > 255)
					ri = 255;
			}
		}
		// g.fillOval(0, 0, getSize().width-1, getSize().height-1);
		// 在焦点上画出一个标签
		super.paintComponent(g);
	} // 画出一个边框

	protected void paintBorder(Graphics g) {
		g.setColor(new Color(150, 150, 150));

		g.drawOval(0, 0, getSize().width - 1, getSize().height - 1);
	}

	// 侦察单击区域
	Shape shape;

	public boolean contains(int x, int y) {
		// 如果按钮改变了尺寸将重新创建一个Shape
		if (shape == null || !shape.getBounds().equals(getBounds())) {
			shape = new Ellipse2D.Float(0, 0, getWidth(), getHeight());
		}
		return shape.contains(x, y);
	}
}